package com.chaos.framework.model.helper;

import java.util.NoSuchElementException;
import java.util.Objects;


public class EnumHelper {

    public interface EnumType {
        int getValue();

        String getName();
    }


    /**
     * 获取相应的枚举值 (如果不存在则报错)
     *
     * @param c     枚举类
     * @param value 值
     * @param <T>   泛型参数
     * @return 相应的枚举值
     */
    public static <T extends EnumType> T of(Class<T> c, int value) {
        T t = ofNullable(c, value);

        if (Objects.isNull(t)) {
            throw new NoSuchElementException("该枚举中没有这个元素. 类名: " + c.getName() + ", value: " + value);
        }

        return t;
    }

    /**
     * 获取相应的枚举值 (如果不存返回null)
     *
     * @param c     枚举类
     * @param value 值
     * @param <T>   泛型参数
     * @return 相应的枚举值
     */
    public static <T extends EnumType> T ofNullable(Class<T> c, int value) {
        T[] constants = c.getEnumConstants();

        for (T constant : constants) {
            if (constant.getValue() == value) {
                return constant;
            }
        }
        return null;
    }


    /**
     * 获取相应的枚举值 (如果不存在则报错)
     *
     * @param c    枚举类
     * @param name 名字
     * @param <T>  泛型参数
     * @return 相应的枚举值
     */
    public static <T extends EnumType> T of(Class<T> c, String name) {
        T t = ofNullable(c, name);

        if (Objects.isNull(t)) {
            throw new NoSuchElementException("该枚举中没有这个元素. 类名: " + c.getName() + ", name: " + name);
        }

        return t;
    }

    /**
     * 获取相应的枚举值 (如果不存返回null)
     *
     * @param c    枚举类
     * @param name 名字
     * @param <T>  泛型参数
     * @return 相应的枚举值
     */
    public static <T extends EnumType> T ofNullable(Class<T> c, String name) {
        T[] constants = c.getEnumConstants();

        for (T constant : constants) {
            if (constant.getName().equals(name)) {
                return constant;
            }
        }

        return null;
    }
}
